(PART) Shiny Apps

COVID 19 Dashboard

Data

# Github 
covid19_confirmed_git <-"https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv"
covid19_confirmed_git <- read_csv(url(covid19_confirmed_git))

# Worldometer
## Covid
codivid19_all <- "https://www.worldometers.info/coronavirus/"
main_table <- codivid19_all%>%
  xml2::read_html()%>%
  html_nodes(xpath='//*[@id="main_table_countries_today"]') %>%
  html_table()
main_table <- as.data.frame(main_table)
## Filtering data for Balkan countries (plus Italy and Austria)
balkan <- filter(main_table,Country.Other == "Bosnia and Herzegovina" | Country.Other == "Italy" | Country.Other == "Croatia" | Country.Other == "Serbia"  | Country.Other == "Montenegro"  | Country.Other == "Slovenia"  | Country.Other == "Austria"  | Country.Other == "North Macedonia" | Country.Other == "Greece")
# Removing comma from numbers
balkan[c("TotalRecovered","TotalDeaths","TotalCases","NewCases","ActiveCases","Tot.Cases.1M.pop")] <- lapply(balkan[c("TotalRecovered","TotalDeaths","TotalCases","NewCases","ActiveCases","Tot.Cases.1M.pop")], function(x) gsub(",","",x))
# Turning columns to numeric
balkan[c("TotalRecovered","TotalDeaths","TotalCases","NewCases","ActiveCases","Tot.Cases.1M.pop")] <- lapply(balkan[c("TotalRecovered","TotalDeaths","TotalCases","NewCases","ActiveCases","Tot.Cases.1M.pop")], as.numeric)

Curve of confirmed cases

The graph shows the number of confirmed cases by the last date shown.Updates daily at around 23:59 UTC.

# Curve of confirmed cases----
columns <- colnames(covid19_confirmed_git)[5:ncol(covid19_confirmed_git)]
final <-as.data.frame(pivot_longer(covid19_confirmed_git, cols = columns, names_to = "Year", values_to = "Confirmed"))
final$Year <- as.Date.character(final$Year,"%m/%d/%y")
colnames(final) <- c("Province","Country","Lat","Long","Year","Confirmed") 
filter <- filter(final, Country == "Bosnia and Herzegovina" | Country == "Italy" | Country == "Croatia" | Country == "Serbia"  | Country == "Slovenia"  | Country == "Montenegro"  | Country == "Austria" | Country == "North Macedonia" | Country == "Greece")
p <-ggplot(filter, aes(x = Year, y = Confirmed)) + 
  geom_line(aes(color = Country), size = 1) +
  scale_color_brewer(palette="Set1")+
  theme(legend.title = element_text(size = 6),legend.text = element_text(size = 6),  
  # Remove panel background
  panel.background = element_blank(),
  # Add axis line
  axis.line = element_line(colour = "grey"),
  axis.text.x = element_text(angle = 90))+
  scale_y_log10(labels = comma)+
  scale_x_date(date_labels = "%b-%d", date_breaks = "4 week")+
  ylab("Confirmed cases")+
  labs(caption="Data source: https://github.com/CSSEGISandData/COVID-19")
ggplotly(p)

Total cases per 1 million people

```r
tot_cases_1m <- melt(balkan[,c(\Tot.Cases.1M.pop\,\Country.Other\)])
head(tot_cases_1m)
p<-ggplot(tot_cases_1m, aes(x=Country.Other,y=value,fill=Country.Other)) +
  geom_bar(stat = \identity\)+
  scale_fill_manual(name=\Country\,
                    values = c(\#E41A1C\,
                               \#377EB8\,
                               \#4DAF4A\,
                               \#984EA3\,
                               \#FF7F00\,
                               \#FFFF33\,
                               \#A65628\,
                               \#F781BF\,
                               \#999999\),
                    labels=c(\Austria\,
                             \Bosnia and Herzegovina\,
                             \Croatia\,
                             \Greece\,
                             \Italy\,
                             \Montenegro\,
                             \N.Macedonia\,
                             \Serbia\,
                             \Slovenia\))+
  labs(x=\\,y=\Total Cases per 1M people\, title = \Total Cases per 1m people - Currently\)+
  theme(legend.title = element_text(size = 8),
        axis.text.x = element_blank(),
        legend.text = element_text(size = 8),
        panel.background = element_blank(),
        axis.line = element_line(colour = \grey\))

ggplotly(p)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->





## Deaths vs Recovered 

The bar chart shows the total number of recovered people in comparison to the total number of death cases. Updates daily at around 23:59 UTC.


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxub3B0aW9ucyhzY2lwZW4gPSA5OTk5KVxucCA8LSBnZ3Bsb3QoYmFsa2FuKSArXG4gIGdlb21fc2VnbWVudCggYWVzKHg9Q291bnRyeS5PdGhlciwgeGVuZD1Db3VudHJ5Lk90aGVyLCB5PVRvdGFsUmVjb3ZlcmVkLCB5ZW5kPVRvdGFsRGVhdGhzKSwgY29sb3I9XFxncmV5XFwpICtcbiAgZ2VvbV9wb2ludCggYWVzKHg9Q291bnRyeS5PdGhlciwgeT1Ub3RhbFJlY292ZXJlZCksIGNvbG9yPXJnYigwLjIsMC43LDAuMSwwLjUpLCBzaXplPTMgKSArXG4gIGdlb21fcG9pbnQoIGFlcyh4PUNvdW50cnkuT3RoZXIsIHk9VG90YWxEZWF0aHMpLCBjb2xvcj1yZ2IoMC43LDAuMiwwLjEsMC41KSwgc2l6ZT0zICkgKyBjb29yZF9mbGlwKCkrXG4gIHNjYWxlX3lfbG9nMTAoKStcbiAgdGhlbWVfbWluaW1hbCgpICtcbiAgdGhlbWUoXG4gIGxlZ2VuZC5wb3NpdGlvbiA9IFxcbm9uZVxcLFxuICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLFxuICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLFxuICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gXFxncmV5XFwpKSArXG4gICAgeGxhYihcXFxcKSArXG4gICAgeWxhYihcXE51bWJlciBvZiBjYXNlc1xcKStcbiAgICBnZ3RpdGxlKGxhYmVsID0gXFxEZWF0aCB2cyBSZWNvdmVyZWRcXClcbmdncGxvdGx5KHApXG5gYGBcbmBgYCJ9 -->

```r
```r
options(scipen = 9999)
p <- ggplot(balkan) +
  geom_segment( aes(x=Country.Other, xend=Country.Other, y=TotalRecovered, yend=TotalDeaths), color=\grey\) +
  geom_point( aes(x=Country.Other, y=TotalRecovered), color=rgb(0.2,0.7,0.1,0.5), size=3 ) +
  geom_point( aes(x=Country.Other, y=TotalDeaths), color=rgb(0.7,0.2,0.1,0.5), size=3 ) + coord_flip()+
  scale_y_log10()+
  theme_minimal() +
  theme(
  legend.position = \none\,
  panel.background = element_blank(),
  panel.grid = element_blank(),
  axis.line = element_line(colour = \grey\)) +
    xlab(\\) +
    ylab(\Number of cases\)+
    ggtitle(label = \Death vs Recovered\)
ggplotly(p)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


## Active cases vs New cases

The bar chart shows the number of  active cases in comparison to the number of new cases being constantly reported.


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBBY3RpdmUgY2FzZXMgdnMgTmV3IGNhc2VzXG5hY3RpdmVfYW5kX25ldyA8LSBtZWx0KGJhbGthblssYyhcXEFjdGl2ZUNhc2VzXFwsXFxOZXdDYXNlc1xcLFxcQ291bnRyeS5PdGhlclxcKV0pXG5wIDwtIGdncGxvdChhY3RpdmVfYW5kX25ldywgYWVzKHg9Q291bnRyeS5PdGhlciwgeT12YWx1ZSwgZmlsbD12YXJpYWJsZSkpICtcbiAgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLCBwb3NpdGlvbj0nZG9kZ2UnLCBjb2xvcj1cXGJsYWNrXFwgLGFlcyh0ZXh0PXBhc3RlKFxcQ291bnRyeTogXFwsQ291bnRyeS5PdGhlciwgXFxcXG5cXCwgdmFyaWFibGUsXFw6XFwsdmFsdWUsIHNlcD1cXFxcKSkpICtcbiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9IFxcUGFpcmVkXFwpK1xuICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPWNvbW1hLCB0cmFucyA9IFxcbG9nMTBcXCkgK1xuICB5bGFiKFxcTnVtYmVyIG9mIGNhc2VzXFwpK1xuICB4bGFiKFxcXFwpK1xuICB0aGVtZV9taW5pbWFsKCkrXG4gIGxhYnModGl0bGUgPSBcXFxcLGZpbGw9XFxcXCkrXG4gIGNvb3JkX2ZsaXAoKVxuICBcbmdncGxvdGx5KHAsIHRvb2x0aXAgPSBcXHRleHRcXClcbmBgYFxuYGBgIn0= -->

```r
```r
# Active cases vs New cases
active_and_new <- melt(balkan[,c(\ActiveCases\,\NewCases\,\Country.Other\)])
p <- ggplot(active_and_new, aes(x=Country.Other, y=value, fill=variable)) +
  geom_bar(stat='identity', position='dodge', color=\black\ ,aes(text=paste(\Country: \,Country.Other, \\n\, variable,\:\,value, sep=\\))) +
  scale_fill_brewer(palette = \Paired\)+
  scale_y_continuous(labels=comma, trans = \log10\) +
  ylab(\Number of cases\)+
  xlab(\\)+
  theme_minimal()+
  labs(title = \\,fill=\\)+
  coord_flip()
  
ggplotly(p, tooltip = \text\)

```

LS0tDQp0aXRsZTogIiINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBrZWVwX21kOiB0cnVlDQogICAgdG9jOiB5ZXMNCiAgICBkZl9wcmludDogcGFnZWQNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCmNzczogc3R5bGUuY3NzDQotLS0NCg0KIyAoUEFSVCkgU2hpbnkgQXBwcyB7LX0NCg0KIyBDT1ZJRCAxOSBEYXNoYm9hcmQNCg0KOjo6IHsuaW5mb2JveCAuZ3JhcGggZGF0YS1sYXRleD0ie2dyYXBofSJ9DQpbSGVyZSB5b3UgZ28gZGlyZWN0bHkgdG8gdGhlIGRhc2hib2FyZF0oaHR0cHM6Ly9taXJ6YS1tdWphbm92aWMuc2hpbnlhcHBzLmlvL2NvdmlkLTE5LykNCjo6Og0KDQojIyBEYXRhDQoNCmBgYHtyLGVjaG89RkFMU0UsZXJyb3I9RkFMU0UsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHJ2ZXN0KQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkod2VzYW5kZXJzb24pICAgIA0KbGlicmFyeShzaGlueSkNCmxpYnJhcnkodHdpdHRlUikNCmxpYnJhcnkocnR3ZWV0KQ0KbGlicmFyeShzZW50aW1lbnRyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHB1cnJyKQ0KbGlicmFyeShkZXZ0b29scykNCmxpYnJhcnkodGV4dGRhdGEpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdndGhlbWVzKQ0KbGlicmFyeSh4bWwyKQ0KbGlicmFyeShxZGFwKQ0KbGlicmFyeSh3b3JkY2xvdWQpDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCmxpYnJhcnkoTkxQKQ0KbGlicmFyeSh0bSkNCmxpYnJhcnkodGlkeXRleHQpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZ2d0aGVtZXMpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShicm9vbSkNCmxpYnJhcnkocmVtb3RlcykNCmxpYnJhcnkoamFuZWF1c3RlbnIpDQpsaWJyYXJ5KHFkYXApDQpsaWJyYXJ5KGdsdWUpDQpsaWJyYXJ5KHN5dXpoZXQpDQpsaWJyYXJ5KG1hZ3JpdHRyKQ0KYGBgDQoNCg0KYGBge3IsIGVycm9yPUZBTFNFLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCiMgR2l0aHViIA0KY292aWQxOV9jb25maXJtZWRfZ2l0IDwtImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOS9tYXN0ZXIvY3NzZV9jb3ZpZF8xOV9kYXRhL2Nzc2VfY292aWRfMTlfdGltZV9zZXJpZXMvdGltZV9zZXJpZXNfY292aWQxOV9jb25maXJtZWRfZ2xvYmFsLmNzdiINCmNvdmlkMTlfY29uZmlybWVkX2dpdCA8LSByZWFkX2Nzdih1cmwoY292aWQxOV9jb25maXJtZWRfZ2l0KSkNCg0KIyBXb3JsZG9tZXRlcg0KIyMgQ292aWQNCmNvZGl2aWQxOV9hbGwgPC0gImh0dHBzOi8vd3d3Lndvcmxkb21ldGVycy5pbmZvL2Nvcm9uYXZpcnVzLyINCm1haW5fdGFibGUgPC0gY29kaXZpZDE5X2FsbCU+JQ0KICB4bWwyOjpyZWFkX2h0bWwoKSU+JQ0KICBodG1sX25vZGVzKHhwYXRoPScvLypbQGlkPSJtYWluX3RhYmxlX2NvdW50cmllc190b2RheSJdJykgJT4lDQogIGh0bWxfdGFibGUoKQ0KbWFpbl90YWJsZSA8LSBhcy5kYXRhLmZyYW1lKG1haW5fdGFibGUpDQoNCg0KYGBgDQoNCg0KYGBge3IsIGVycm9yPUZBTFNFLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSxlY2hvPVRSVUV9DQojIyBGaWx0ZXJpbmcgZGF0YSBmb3IgQmFsa2FuIGNvdW50cmllcyAocGx1cyBJdGFseSBhbmQgQXVzdHJpYSkNCmJhbGthbiA8LSBmaWx0ZXIobWFpbl90YWJsZSxDb3VudHJ5Lk90aGVyID09ICJCb3NuaWEgYW5kIEhlcnplZ292aW5hIiB8IENvdW50cnkuT3RoZXIgPT0gIkl0YWx5IiB8IENvdW50cnkuT3RoZXIgPT0gIkNyb2F0aWEiIHwgQ291bnRyeS5PdGhlciA9PSAiU2VyYmlhIiAgfCBDb3VudHJ5Lk90aGVyID09ICJNb250ZW5lZ3JvIiAgfCBDb3VudHJ5Lk90aGVyID09ICJTbG92ZW5pYSIgIHwgQ291bnRyeS5PdGhlciA9PSAiQXVzdHJpYSIgIHwgQ291bnRyeS5PdGhlciA9PSAiTm9ydGggTWFjZWRvbmlhIiB8IENvdW50cnkuT3RoZXIgPT0gIkdyZWVjZSIpDQpgYGANCg0KDQpgYGB7ciwgZXJyb3I9RkFMU0UsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFLGVjaG89VFJVRX0NCiMgUmVtb3ZpbmcgY29tbWEgZnJvbSBudW1iZXJzDQpiYWxrYW5bYygiVG90YWxSZWNvdmVyZWQiLCJUb3RhbERlYXRocyIsIlRvdGFsQ2FzZXMiLCJOZXdDYXNlcyIsIkFjdGl2ZUNhc2VzIiwiVG90LkNhc2VzLjFNLnBvcCIpXSA8LSBsYXBwbHkoYmFsa2FuW2MoIlRvdGFsUmVjb3ZlcmVkIiwiVG90YWxEZWF0aHMiLCJUb3RhbENhc2VzIiwiTmV3Q2FzZXMiLCJBY3RpdmVDYXNlcyIsIlRvdC5DYXNlcy4xTS5wb3AiKV0sIGZ1bmN0aW9uKHgpIGdzdWIoIiwiLCIiLHgpKQ0KIyBUdXJuaW5nIGNvbHVtbnMgdG8gbnVtZXJpYw0KYmFsa2FuW2MoIlRvdGFsUmVjb3ZlcmVkIiwiVG90YWxEZWF0aHMiLCJUb3RhbENhc2VzIiwiTmV3Q2FzZXMiLCJBY3RpdmVDYXNlcyIsIlRvdC5DYXNlcy4xTS5wb3AiKV0gPC0gbGFwcGx5KGJhbGthbltjKCJUb3RhbFJlY292ZXJlZCIsIlRvdGFsRGVhdGhzIiwiVG90YWxDYXNlcyIsIk5ld0Nhc2VzIiwiQWN0aXZlQ2FzZXMiLCJUb3QuQ2FzZXMuMU0ucG9wIildLCBhcy5udW1lcmljKQ0KYGBgDQoNCg0KIyMgQ3VydmUgb2YgY29uZmlybWVkIGNhc2VzIA0KDQpUaGUgZ3JhcGggc2hvd3MgdGhlIG51bWJlciBvZiBjb25maXJtZWQgY2FzZXMgYnkgdGhlIGxhc3QgZGF0ZSBzaG93bi5VcGRhdGVzIGRhaWx5IGF0IGFyb3VuZCAyMzo1OSBVVEMuDQoNCmBgYHtyLHdhcm5pbmc9RkFMU0UsZXJyb3I9RkFMU0UsbWVzc2FnZT1GQUxTRSxmaWcud2lkdGg9OCxlY2hvPVRSVUV9DQojIEN1cnZlIG9mIGNvbmZpcm1lZCBjYXNlcy0tLS0NCmNvbHVtbnMgPC0gY29sbmFtZXMoY292aWQxOV9jb25maXJtZWRfZ2l0KVs1Om5jb2woY292aWQxOV9jb25maXJtZWRfZ2l0KV0NCmZpbmFsIDwtYXMuZGF0YS5mcmFtZShwaXZvdF9sb25nZXIoY292aWQxOV9jb25maXJtZWRfZ2l0LCBjb2xzID0gY29sdW1ucywgbmFtZXNfdG8gPSAiWWVhciIsIHZhbHVlc190byA9ICJDb25maXJtZWQiKSkNCmZpbmFsJFllYXIgPC0gYXMuRGF0ZS5jaGFyYWN0ZXIoZmluYWwkWWVhciwiJW0vJWQvJXkiKQ0KY29sbmFtZXMoZmluYWwpIDwtIGMoIlByb3ZpbmNlIiwiQ291bnRyeSIsIkxhdCIsIkxvbmciLCJZZWFyIiwiQ29uZmlybWVkIikgDQpmaWx0ZXIgPC0gZmlsdGVyKGZpbmFsLCBDb3VudHJ5ID09ICJCb3NuaWEgYW5kIEhlcnplZ292aW5hIiB8IENvdW50cnkgPT0gIkl0YWx5IiB8IENvdW50cnkgPT0gIkNyb2F0aWEiIHwgQ291bnRyeSA9PSAiU2VyYmlhIiAgfCBDb3VudHJ5ID09ICJTbG92ZW5pYSIgIHwgQ291bnRyeSA9PSAiTW9udGVuZWdybyIgIHwgQ291bnRyeSA9PSAiQXVzdHJpYSIgfCBDb3VudHJ5ID09ICJOb3J0aCBNYWNlZG9uaWEiIHwgQ291bnRyeSA9PSAiR3JlZWNlIikNCnAgPC1nZ3Bsb3QoZmlsdGVyLCBhZXMoeCA9IFllYXIsIHkgPSBDb25maXJtZWQpKSArIA0KICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gQ291bnRyeSksIHNpemUgPSAxKSArDQogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJTZXQxIikrDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCAgDQogICMgUmVtb3ZlIHBhbmVsIGJhY2tncm91bmQNCiAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgIyBBZGQgYXhpcyBsaW5lDQogIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiZ3JleSIpLA0KICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkrDQogIHNjYWxlX3lfbG9nMTAobGFiZWxzID0gY29tbWEpKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9sYWJlbHMgPSAiJWItJWQiLCBkYXRlX2JyZWFrcyA9ICI0IHdlZWsiKSsNCiAgeWxhYigiQ29uZmlybWVkIGNhc2VzIikrDQogIGxhYnMoY2FwdGlvbj0iRGF0YSBzb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOSIpDQpnZ3Bsb3RseShwKQ0KYGBgDQoNCiMjIFRvdGFsIGNhc2VzIHBlciAxIG1pbGxpb24gcGVvcGxlDQoNCmBgYHtyLGVycm9yPUZBTFNFLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCnRvdF9jYXNlc18xbSA8LSBtZWx0KGJhbGthblssYygiVG90LkNhc2VzLjFNLnBvcCIsIkNvdW50cnkuT3RoZXIiKV0pDQpoZWFkKHRvdF9jYXNlc18xbSkNCnA8LWdncGxvdCh0b3RfY2FzZXNfMW0sIGFlcyh4PUNvdW50cnkuT3RoZXIseT12YWx1ZSxmaWxsPUNvdW50cnkuT3RoZXIpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSsNCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZT0iQ291bnRyeSIsDQogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIiNFNDFBMUMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjMzc3RUI4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIzREQUY0QSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiM5ODRFQTMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjRkY3RjAwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI0ZGRkYzMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNBNjU2MjgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjRjc4MUJGIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIzk5OTk5OSIpLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiQXVzdHJpYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCb3NuaWEgYW5kIEhlcnplZ292aW5hIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyb2F0aWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR3JlZWNlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkl0YWx5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vbnRlbmVncm8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTi5NYWNlZG9uaWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VyYmlhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNsb3ZlbmlhIikpKw0KICBsYWJzKHg9IiIseT0iVG90YWwgQ2FzZXMgcGVyIDFNIHBlb3BsZSIsIHRpdGxlID0gIlRvdGFsIENhc2VzIHBlciAxbSBwZW9wbGUgLSBDdXJyZW50bHkiKSsNCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJncmV5IikpDQoNCmdncGxvdGx5KHApDQoNCmBgYA0KDQoNCg0KDQojIyBEZWF0aHMgdnMgUmVjb3ZlcmVkIA0KDQpUaGUgYmFyIGNoYXJ0IHNob3dzIHRoZSB0b3RhbCBudW1iZXIgb2YgcmVjb3ZlcmVkIHBlb3BsZSBpbiBjb21wYXJpc29uIHRvIHRoZSB0b3RhbCBudW1iZXIgb2YgZGVhdGggY2FzZXMuIFVwZGF0ZXMgZGFpbHkgYXQgYXJvdW5kIDIzOjU5IFVUQy4NCg0KYGBge3IsIGVycm9yPUZBTFNFLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSxlY2hvPVRSVUV9DQpvcHRpb25zKHNjaXBlbiA9IDk5OTkpDQpwIDwtIGdncGxvdChiYWxrYW4pICsNCiAgZ2VvbV9zZWdtZW50KCBhZXMoeD1Db3VudHJ5Lk90aGVyLCB4ZW5kPUNvdW50cnkuT3RoZXIsIHk9VG90YWxSZWNvdmVyZWQsIHllbmQ9VG90YWxEZWF0aHMpLCBjb2xvcj0iZ3JleSIpICsNCiAgZ2VvbV9wb2ludCggYWVzKHg9Q291bnRyeS5PdGhlciwgeT1Ub3RhbFJlY292ZXJlZCksIGNvbG9yPXJnYigwLjIsMC43LDAuMSwwLjUpLCBzaXplPTMgKSArDQogIGdlb21fcG9pbnQoIGFlcyh4PUNvdW50cnkuT3RoZXIsIHk9VG90YWxEZWF0aHMpLCBjb2xvcj1yZ2IoMC43LDAuMiwwLjEsMC41KSwgc2l6ZT0zICkgKyBjb29yZF9mbGlwKCkrDQogIHNjYWxlX3lfbG9nMTAoKSsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJncmV5IikpICsNCiAgICB4bGFiKCIiKSArDQogICAgeWxhYigiTnVtYmVyIG9mIGNhc2VzIikrDQogICAgZ2d0aXRsZShsYWJlbCA9ICJEZWF0aCB2cyBSZWNvdmVyZWQiKQ0KZ2dwbG90bHkocCkNCmBgYA0KDQojIyBBY3RpdmUgY2FzZXMgdnMgTmV3IGNhc2VzDQoNClRoZSBiYXIgY2hhcnQgc2hvd3MgdGhlIG51bWJlciBvZiAgYWN0aXZlIGNhc2VzIGluIGNvbXBhcmlzb24gdG8gdGhlIG51bWJlciBvZiBuZXcgY2FzZXMgYmVpbmcgY29uc3RhbnRseSByZXBvcnRlZC4NCg0KYGBge3IsIGVycm9yPUZBTFNFLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSxlY2hvPVRSVUV9DQojIEFjdGl2ZSBjYXNlcyB2cyBOZXcgY2FzZXMNCmFjdGl2ZV9hbmRfbmV3IDwtIG1lbHQoYmFsa2FuWyxjKCJBY3RpdmVDYXNlcyIsIk5ld0Nhc2VzIiwiQ291bnRyeS5PdGhlciIpXSkNCnAgPC0gZ2dwbG90KGFjdGl2ZV9hbmRfbmV3LCBhZXMoeD1Db3VudHJ5Lk90aGVyLCB5PXZhbHVlLCBmaWxsPXZhcmlhYmxlKSkgKw0KICBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsIHBvc2l0aW9uPSdkb2RnZScsIGNvbG9yPSJibGFjayIgLGFlcyh0ZXh0PXBhc3RlKCJDb3VudHJ5OiAiLENvdW50cnkuT3RoZXIsICJcbiIsIHZhcmlhYmxlLCI6Iix2YWx1ZSwgc2VwPSIiKSkpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJQYWlyZWQiKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1jb21tYSwgdHJhbnMgPSAibG9nMTAiKSArDQogIHlsYWIoIk51bWJlciBvZiBjYXNlcyIpKw0KICB4bGFiKCIiKSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBsYWJzKHRpdGxlID0gIiIsZmlsbD0iIikrDQogIGNvb3JkX2ZsaXAoKQ0KICANCmdncGxvdGx5KHAsIHRvb2x0aXAgPSAidGV4dCIpDQpgYGANCg0KDQoNCg0KYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0UsZXJyb3I9RkFMU0UsZmlnLnNob3c9J2FzaXMnLGV2YWw9RkFMU0V9DQojSG9zcGl0YWxpc2F0aW9uDQpob3NwaXRhbGl6YXRpb24gPC0gcmVhZC5jc3YoImRhdGEvSG9zcGl0YWxpemF0aW9uX2FsbF9sb2NzLmNzdiIpDQpob3NwaXRhbGl6YXRpb24kWCA8LSBOVUxMDQoNCmNvbHVtbnMgPC0gY29sbmFtZXMoaG9zcGl0YWxpemF0aW9uKVszOm5jb2woaG9zcGl0YWxpemF0aW9uKV0NCnBpdm90X2hvc3BpdGFsaXphdGlvbjwtYXMuZGF0YS5mcmFtZShwaXZvdF9sb25nZXIoaG9zcGl0YWxpemF0aW9uLCBjb2xzID0gY29sdW1ucykpDQpjb2xuYW1lcyhwaXZvdF9ob3NwaXRhbGl6YXRpb24pIDwtIGMoIkNvdW50cnkiLCJEYXRlIiwiVmFyaWFibGUiLCJWYWx1ZSIpIA0KcGl2b3RfaG9zcGl0YWxpemF0aW9uLm1lYW4uRVUgPC0gZmlsdGVyKHBpdm90X2hvc3BpdGFsaXphdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlID09ICJhZG1pc19tZWFuInwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlID09ICJhbGxiZWRfbWVhbiJ8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZSA9PSAiYmVkb3Zlcl9tZWFuInwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlID09ICJJQ1ViZWRfbWVhbiJ8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZSA9PSAiaWN1b3Zlcl9tZWFuInwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlID09ICJpbnZWZW5fbWVhbiJ8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZSA9PSAibmV3SUNVX21lYW4iKQ0KcGl2b3RfaG9zcGl0YWxpemF0aW9uLm1lYW4uRVUgPC0gZmlsdGVyKHBpdm90X2hvc3BpdGFsaXphdGlvbi5tZWFuLkVVLCBWYWx1ZSA+IDApDQpwaXZvdF9ob3NwaXRhbGl6YXRpb24ubWVhbi5FVSREYXRlIDwtIGFzLkRhdGUoYXMuUE9TSVhjdChwaXZvdF9ob3NwaXRhbGl6YXRpb24ubWVhbi5FVSREYXRlLCIlWSVNJUQiKSkNCmBgYA0KDQoNCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFLGVycm9yPUZBTFNFLGZpZy5zaG93PSdhc2lzJyxldmFsPUZBTFNFfQ0KI0Nyb2F0aWENCnBpdm90X2hvc3BpdGFsaXphdGlvbi5tZWFuLmNybyA8LSBmaWx0ZXIocGl2b3RfaG9zcGl0YWxpemF0aW9uLm1lYW4uRVUsQ291bnRyeSA9PSAiQ3JvYXRpYSIpDQoNCnAgPC0gZ2dwbG90KHBpdm90X2hvc3BpdGFsaXphdGlvbi5tZWFuLmNybyxhZXMoeD1EYXRlLHk9VmFsdWUpKSArDQogIGdlb21fbGluZShhZXMoY29sb3I9VmFyaWFibGUpLCBzaXplPTEpICsNCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIpICsNCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSxsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICANCiAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJncmV5IikpKw0KICBzY2FsZV95X3NxcnQoKSsNCiAgZ2d0aXRsZShsYWJlbCA9ICJIb3NwaXRhbGlzYXRpb24gbnVtYmVycyBpbiBDcm9hdGlhIikrDQogIHNjYWxlX3hfZGF0ZShkYXRlX2xhYmVscyA9ICIlQi0lZCIsIGRhdGVfYnJlYWtzID0gIjUgd2VlayIpKw0KICB5bGFiKCJNZWFuIikrDQogIGxhYnMoY2FwdGlvbj0iRGF0YSBzb3VyY2U6ICIpDQoNCmdncGxvdGx5KHApDQpgYGANCg0KDQpgYGB7cixlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSxlcnJvcj1GQUxTRSxmaWcuc2hvdz0nYXNpcycsZXZhbD1GQUxTRX0NCiNTbG92ZW5pYQ0KcGl2b3RfaG9zcGl0YWxpemF0aW9uLm1lYW4uc2xvIDwtIGZpbHRlcihwaXZvdF9ob3NwaXRhbGl6YXRpb24ubWVhbi5FVSxDb3VudHJ5ID09ICJTbG92ZW5pYSIpDQoNCnAgPC0gZ2dwbG90KHBpdm90X2hvc3BpdGFsaXphdGlvbi5tZWFuLnNsbyxhZXMoeD1EYXRlLHk9VmFsdWUpKSArDQogIGdlb21fbGluZShhZXMoY29sb3I9VmFyaWFibGUpLCBzaXplPTEpICsNCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIpICsNCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSxsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICANCiAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJncmV5IikpKw0KICBzY2FsZV95X3NxcnQoKSsNCiAgZ2d0aXRsZShsYWJlbCA9ICJIb3NwaXRhbGlzYXRpb24gbnVtYmVycyBpbiBTbG92ZW5pYSIpKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9sYWJlbHMgPSAiJUItJWQiLCBkYXRlX2JyZWFrcyA9ICI1IHdlZWsiKSsNCiAgeWxhYigiTWVhbiIpKw0KICBsYWJzKGNhcHRpb249IkRhdGEgc291cmNlOiAiKQ0KDQpnZ3Bsb3RseShwKQ0KYGBgDQoNCg0KYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0UsZXJyb3I9RkFMU0UsZmlnLnNob3c9J2FzaXMnLGV2YWw9RkFMU0V9DQojQXVzdHJpYQ0KcGl2b3RfaG9zcGl0YWxpemF0aW9uLm1lYW4uYXQgPC0gZmlsdGVyKHBpdm90X2hvc3BpdGFsaXphdGlvbi5tZWFuLkVVLENvdW50cnkgPT0gIkF1c3RyaWEiKQ0KDQpwIDwtIGdncGxvdChwaXZvdF9ob3NwaXRhbGl6YXRpb24ubWVhbi5hdCxhZXMoeD1EYXRlLHk9VmFsdWUpKSArDQogIGdlb21fbGluZShhZXMoY29sb3I9VmFyaWFibGUpLCBzaXplPTEpICsNCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIpICsNCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSxsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksICANCiAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJncmV5IikpKw0KICBzY2FsZV95X3NxcnQoKSsNCiAgZ2d0aXRsZShsYWJlbCA9ICJIb3NwaXRhbGlzYXRpb24gbnVtYmVycyBpbiBBdXN0cmlhIikrDQogIHNjYWxlX3hfZGF0ZShkYXRlX2xhYmVscyA9ICIlQi0lZCIsIGRhdGVfYnJlYWtzID0gIjUgd2VlayIpKw0KICB5bGFiKCJNZWFuIikrDQogIGxhYnMoY2FwdGlvbj0iRGF0YSBzb3VyY2U6ICIpDQoNCmdncGxvdGx5KHApDQpgYGANCg0K